package com.scvtc.utils;

import com.scvtc.domain.ResResult;
import org.jetbrains.annotations.NotNull;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.Objects;

import static com.scvtc.constants.SystemCheckedConstants.FIlE_SUFFIX;
import static com.scvtc.constants.SystemConstants.FILE_UPLOAD;
import static com.scvtc.domain.enums.AppHttpCodeEnum.*;

/**
 * @Description: 文件上传工具类
 * @Author: yiFei
 * @date: 2022/4/20 21:54
 */
@Component
public class MultipartFileUtil {

    private MultipartFileUtil() {
    }

    private static final Logger log = LoggerFactory.getLogger(MultipartFileUtil.class);
    private static String fileUploadPath;

    private static String fileDownloadPath;

    private static String fileAccessUrl;

    @Value("${file.access.url}")
    public void setFileAccessUrl(String fileAccessUrl) {
        MultipartFileUtil.fileAccessUrl = fileAccessUrl;
    }

    @Value("${file.upload.path}")
    public void setFileUploadPath(String fileUploadPath) {
        MultipartFileUtil.fileUploadPath = fileUploadPath;
    }

    @Value("${file.download.path}")
    public void setFileDownloadPath(String fileDownloadPath) {
        MultipartFileUtil.fileDownloadPath = fileDownloadPath;
    }

    public static boolean deleteFile(String path) {
        File file = new File(fileUploadPath.concat(path));
        // 文件不存在 返回false
        if (!file.exists()) return false;
        // 文件
        if (file.isFile() || file.list() == null) { //传的是文件
            return file.delete();
        } else {
            return false;
        }
    }

    /**
     * 文件上传
     *
     * @param file
     * @param dir
     */
    public static ResResult<?> uploadFile(@NotNull MultipartFile file, String dir) {
        dir = StringUtils.hasText(dir) ? dir : FILE_UPLOAD;
        // 传入文件拼接 /
        dir += "/";
        // 获取原文件名
        String filename = Objects.requireNonNull(file.getOriginalFilename()).substring(0, file.getOriginalFilename().indexOf("."));
        // 获取文件后缀
        String fileSuffix = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
        // 如果后缀不符合就直接返回
        if (!FileUploadUtil.CheckSuffix(FIlE_SUFFIX, fileSuffix)) {
            return ResResult.customize(FILE_SUFFIX_ERROR, fileSuffix);
        }
        // 生成UUID 重命名 源文件
        String datePath = FileUploadUtil.getDatePath();
        File folder = new File(fileUploadPath + dir + datePath);
        // 文件不存在就创建
        if (!folder.exists()) folder.mkdirs();
        // 拼接文件名
        String UUIDPath = UUIDUtil.getUUID();
        // 如果路径不存在，上面的代码会创建路径，此时路径即已经创建好了

        // 新的文件路径 前端存入文件路径
        String savePath = dir + datePath + filename + "-" + UUIDPath + fileSuffix;
        try {
            // 指定路径 如果没有就创建文件夹
            File saveFile = new File(fileUploadPath + dir + datePath, filename + "-" + UUIDPath + fileSuffix);
            log.info("文件将要保存的路径：{}", saveFile.getPath());
            file.transferTo(saveFile.getAbsoluteFile());
            log.info("文件成功保存的路径：{}", saveFile.getAbsolutePath());
        } catch (IOException e) {
            e.printStackTrace();
            // 抛出异常响应失败
            return ResResult.customize(FILE_UPLOAD_ERROR);
        }
        // 文件上传成功返回信息
        // 前端不需要前置的  / 所以这里替换了
        return ResResult.customize(FILE_UPLOAD_SUCCESS, savePath);
    }

}
